﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.UI;
using Quaack.Data.Properties;

namespace Quaack.Data
{

    /// <summary>
    /// Singleton-klasse welke de toegang tot de database regelt
    /// </summary>
    public class Provider
    {

        private static Provider instance;
        private SqlConnection connection;

        /// <summary>
        /// Geeft de instantie van deze klasse, er wordt afgedwongen
        /// dat er maar één instantie van de klasse kan zijn (meerdere
        /// database-connecties is niet zinvol)
        /// </summary>
        public static Provider Instance
        {
            get
            {
                // Instantie aanmaken als deze nog niet bestond
                if (instance == null)
                {
                    instance = new Provider();
                }
                return instance;
            }
        }

        public static void CloseConnection()
        {
            if (instance != null)
            {
                instance.connection.Close();
            }
        }

        public static bool IsHomePage
        {
            get
            {
                try
                {
                    return CurrentUser.Id == CurrentUserPage.Id;
                }
                catch
                {

                    return false;
                }

            }
        }


        public static Profiel CurrentUser
        {
            get { return (Profiel)HttpContext.Current.Items["CurrentUser"]; }
            set { HttpContext.Current.Items["CurrentUser"] = value; }
        }

        public static Profiel CurrentUserPage{get;set;}

        public static List<Profiel> SearchResult
        {
            get { return (List<Profiel>)HttpContext.Current.Session["SearchResult"]; }
            set { HttpContext.Current.Session["SearchResult"] = value; }
        }

        /// <summary>
        /// Private constructor, zodat enkel vie het static field "Instance" een 
        /// instantie kan worden opgehaald.
        /// </summary>
        private Provider()
        {
            connection = new SqlConnection(Settings.Default.SqlConnection);
            connection.Open();
        }









        /// <summary>
        /// Maakt een SqlCommand aan, met de opgegeven parameters
        /// </summary>
        /// <param name="command">Het uit te voeren SQL-commando</param>
        /// <param name="parameters">Array met parameter-waardes binnen het commande</param>
        /// <returns></returns>
        private SqlCommand Command(string command, SqlParameter[] parameters)
        {
            SqlCommand result = new SqlCommand(command, connection);
            foreach (SqlParameter parameter in parameters)
            {
                result.Parameters.Add(parameter);
            }
            return result;
        }

        /// <summary>
        /// Voert het opgegeven SQL-commando uit
        /// </summary>
        /// <param name="command">Het uit te voeren SQL-commando</param>
        public void Execute(string command)
        {
            Execute(command, new SqlParameter[] { });
        }

        /// <summary>
        /// Voert het opgegeven SQL-commando uit
        /// </summary>
        /// <param name="command">Het uit te voeren SQL-commando</param>
        public void Execute(string command, SqlParameter[] parameters)
        {
            SqlCommand sqlCommand = Command(command, parameters);
            sqlCommand.ExecuteNonQuery();
            sqlCommand.Dispose();
        }

        /// <summary>
        /// Voert het opgegeven SQL-commando uit en retourneert het resultaat als een
        /// SqlDataReader
        /// </summary>
        /// <param name="command">Het uit te voeren SQL-commando</param>
        /// <returns></returns>
        public SqlDataReader ExecuteReader(string command)
        {
            return ExecuteReader(command, new SqlParameter[] { });
        }

        /// <summary>
        /// Voert het opgegeven SQL-commando uit en retourneert het resultaat als een
        /// SqlDataReader
        /// </summary>
        /// <param name="command">Het uit te voeren SQL-commando</param>
        /// <param name="parameters">Array met parameter-waardes binnen het commande</param>
        /// <returns></returns>
        public SqlDataReader ExecuteReader(string command, SqlParameter[] parameters)
        {
            return Command(command, parameters).ExecuteReader();
        }


        /// <summary>
        /// Voert het opgegeven SQL-INSERT-commando uit en geeft de ID terug
        /// </summary>
        /// <param name="command">Het uit te voeren SQL-commando</param>
        public int ExecuteInsert(string command)
        {
            return ExecuteInsert(command, new SqlParameter[] { });
        }

        /// <summary>
        /// Voert het opgegeven SQL-INSERT-commando uit en geeft de ID terug
        /// </summary>
        /// <param name="command">Het uit te voeren SQL-commando</param>
        public int ExecuteInsert(string command, SqlParameter[] parameters)
        {
            // SQL-command ophalen en executen
            SqlCommand sqlCommand = Command(command, parameters);
            sqlCommand.ExecuteNonQuery();
            // Command herschrijven naar ophalen identity
            sqlCommand.Parameters.Clear();
            sqlCommand.CommandText = "SELECT @@IDENTITY";
            // Identity ophalen
            int result = Convert.ToInt32(sqlCommand.ExecuteScalar());
            // Opruimen
            sqlCommand.Dispose();
            // Retourneren
            return result;
        }

        public static void SendMail(string email, string subject, string body)
        {
            Properties.Settings settings = Properties.Settings.Default;
            MailMessage message = new MailMessage(settings.SmtpSender, email, subject, body);
            message.IsBodyHtml = true;

            SmtpClient client = new SmtpClient(settings.SmtpHost, settings.SmtpPort);
            client.UseDefaultCredentials = false;
            client.Credentials = new System.Net.NetworkCredential(settings.SmtpUser, settings.SmtpPassword);
            client.EnableSsl = settings.SmtpSSL;
            client.Send(message);
        }

    }
}
